Blog

New BoxLang Fix: BoxLang BIFs Return Data

Maria Jose Herrera August 08, 2024

Spread the word

Maria Jose Herrera

August 08, 2024

Spread the word


Share your thoughts

Fixing the Array/Struct BIFs That Return ‘True’ for no reason

We’ve got an exciting update for you! In our upcoming beta release, we’re tackling an issue with certain Built-In Functions (BIFs) that return true instead of the original data structure. This change will make chaining operations easier and more intuitive.

Review Original Post

What’s Changing?

Some of the BIFs in CFML return a boolean, which can be confusing and limit their usability. For instance:

myArr.append("foo") // returns myArr
arrayAppend(myArr) // returns true??

In BoxLang, we’re updating these functions so they return the modified data structure instead. Here’s the list of BIFs that will now return the original data structure:

  • arrayAppend()
  • arrayClear()
  • arrayDeleteAt()
  • arrayInsertAt()
  • arrayResize()
  • arraySet()
  • arraySwap()
  • StructClear()
  • StructKeyTranslate()
  • StructInsert()
  • structAppend()
  • QuerySetRow()
  • QueryDeleteRow()
  • QuerySort()
  • ArrayPrepend()
  • arrayDelete()
  • structDelete()

Legacy CF Code Compatibility

Running legacy CF code on BoxLang? No worries! Our transpiler has been updated to handle this. If the return value of a BIF is being used, the transpiler will automatically wrap it in an Immediately Invoked Function Expression (IIFE) that returns true for CF compatibility—except for arrayDelete() and structDelete(), which will maintain their ability to return true or false as originally intended.

BoxLang Ticket

Examples

With the update, you can now chain BIFs more naturally. For example:

Before:

array = [1, 2, 3];
result = arrayAppend(array, 4); // returns true, not the array

After:

array = [1, 2, 3];
result = arrayAppend(array, 4).arrayInsertAt(1, 0).arrayResize(10);
// Returns the modified array, making chaining possible

BIFs That Stay the Same

Some BIFs will remain unchanged because they return something other than the original data structure for a good reason:

  • queryAddColumn() – returns the index of the column removed
  • queryAddRow() – returns the row number added

For QueryDeleteColumn(), we’ll follow Adobe’s behavior and return the query, matching Adobe’s approach rather than Lucee’s array of removed data.

Try BoxLang

Conditional Return Values

These BIFs have the ability to return true or false, and we’ll preserve their original behavior:

  • arrayDelete() – returns true if the array size decreases after the delete operation
  • structDelete() – returns true if indicateNotExisting is set to true and the key existed before deletion

Visualizing the Changes

Here’s how the transpiler works: If you have CF code like this:

result = arrayPrepend(arr, "foo")

It transpiles to BoxLang code:

result = (arg1, arg2) -> {
	arrayPrepend(arg1, arg2);
	return true;
}(arr, "foo");

However, if the result is not assigned to a variable, used as an argument, or included in a flow control statement, it remains unchanged.

More Information

We’re excited about these improvements and hope they make your BoxLang experience smoother and more powerful. Stay tuned for the beta release and enjoy the enhanced functionality!

For further details, check out the ticket

BoxLang Ticket

Add Your Comment

Recent Entries

12 Days of BoxLang - Day 1: ColdBox

12 Days of BoxLang - Day 1: ColdBox

ColdBox + BoxLang: The Future of Modern MVC on the JVM Welcome to Day 1 of the 12 Days of BoxLang

To kick off the series, we’re starting with one of the most powerful combinations in the Ortus ecosystem: ColdBox + BoxLang.

ColdBox has been the standard for modern CFML MVC development for over a decade. BoxLang is the next-generation dynamic language built for JVM and beyond. Together, they reshape how developers build web apps, APIs, microservices, CLIs, and soon desktop applications.

Let’s dive into why ColdBox 8 + BoxLang PRIME is a major milestone for the future of modern application development.

Maria Jose Herrera
Maria Jose Herrera
December 10, 2025
 Introducing CBWIRE v5.0!

 Introducing CBWIRE v5.0!

We are thrilled to announce the release of CBWIRE v5.0, the most powerful, stable, and developer-friendly version of CBWIRE ever shipped.

This major upgrade introduces deep BoxLang support, upgraded Livewire v3.6.4 features, enhanced security, improved error handling, performance gains, and long-requested developer experience improvements across the board.

Whether you're building full applications, dashboards, or reactive components inside ColdBox, CBWIRE v5.0 gives you more power with less friction.

Maria Jose Herrera
Maria Jose Herrera
December 10, 2025
Close the Year Strong: Secure Your 2026 CFML Consulting plan or Professional Support at a Special Rate

Close the Year Strong: Secure Your 2026 CFML Consulting plan or Professional Support at a Special Rate

As we approach the end of the year, many engineering teams face the same challenge: unused budget that must be spent before December 31 or a new 2026 budget that should be allocated strategically from the start.

If your organization relies on ColdFusion or Lucee, this is the ideal moment to secure expert support and ensure a stable, high-performing foundation for next year.

To help te...

Cristobal Escobar
Cristobal Escobar
December 10, 2025